home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / HDX_BACK / HDLFILE / HDLFILE.C < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-09  |  28.2 KB  |  1,420 lines

  1. #include "osbind.h"
  2. #include "obdefs.h"
  3. #include "gemdefs.h"
  4. #include "stat.h"
  5. #include "hdl.h"
  6.  
  7.  
  8. #define OK         1
  9. #define FALSE   -1
  10. #define ERROR   -1
  11. #define FTOF    1
  12. #define FTOD    2
  13. #define DTOD    3
  14. #define DIRLEN  8
  15. #define FILELEN 12
  16.  
  17. OBJECT     *cpbox;            /* cp or rm or mv dialog box */
  18. OBJECT     *samename;        /* name conflict dialog box */
  19. char     *cntopen;        /* can't open file alert box */
  20. char    *cntcrtdr;        /* can't create directory alert box */
  21. char    *cntcrtfl;        /* can't create file alert box */
  22. char    *cntdelf;        /* can't delete file alert box */
  23. char    *cntdeld;        /* can't delete directory alert box */
  24. char    *wrerror;        /* write file error alert box */
  25. char    *rderror;        /* read file error alert box */
  26. char    *nomemory;        /* not sufficient memory alert box */
  27.  
  28. int  srclen, dstlen;    /* the size of source and target buffer */
  29. long numfiles = 0L;        /* the number of files show in the dialog box */
  30. long numdirs = 0L;        /* the number of directories */
  31. long tolsize = 0L;        /* the total size of all files in the path */
  32. int  srcbuf, dstbuf;    /* the size of source and target buffer be define */
  33. int     editdir;            /* the flag for the user edit the name conflict */
  34. char *fixsrc, *fixdst;    /* the source and target string pointer */
  35. long _stksize = 25000;    /* resize the stack size */
  36. char *getall = "*.*";
  37. char *bckslsh = "\\\0";
  38.  
  39. /* AES (windows and messages) related variables */
  40. int formw, formh, sx, sy, lx, ly;    /* dialogue box dimensions */
  41. int hdesk, wdesk;                    /* window X, Y, width, height */
  42.  
  43. char *filestr = "abcdefgh.abcb";    /* the buffer for the file */
  44. char *cptitle = " COPY FILE(S) ";    /* the title for the cp dialog box */
  45. char *mvtitle = " MOVE FILE(S) ";    /* the title for the mv dialog box */
  46. char *rmtitle = "DELETE FILE(S)";    /* the title for the rm dialog box */
  47.  
  48.  
  49. main(argc, argv) 
  50.  
  51. int argc;
  52. char **argv;
  53.  
  54. {
  55.     char *convert();
  56.     char *src, *dst;
  57.     long ndirs,nfiles,tsize;
  58.  
  59.     if(argc < 4)    {
  60.         Cconws("Usage: hdlfile source destination code\r\n");
  61.         Pterm0();
  62.     }
  63.     convert(&src, argv[1]);
  64.     convert(&dst, argv[2]);
  65.     dofiles(src, dst, atoi(argv[3]), &ndirs, &nfiles, &tsize);
  66.  
  67. }
  68.  
  69. char *
  70. convert(ret, src)
  71. char **ret;
  72. char *src;
  73. {
  74.     char *tmp, *tmp1;
  75.  
  76.     tmp1 = (char *)Malloc((long)(sizeof(src)+10));
  77.     strcpy(src, tmp1);
  78.     tmp = tmp1;
  79.     while(*tmp)    ++tmp;
  80.     if (*(tmp-1) == 'a')    {
  81.         *(tmp-1) = '\0';
  82.         strcat("*.*", tmp1);
  83.     }
  84.     *ret = tmp1;
  85. }
  86.  
  87. d_next(s)
  88. char **s;
  89.     *s = fixdst;
  90.     return (0); 
  91. }
  92.  
  93. dofiles(s, d, code, ndirs, nfiles, tsize)
  94.  
  95. char *s, *d;
  96. int code;
  97. long *ndirs, *nfiles, *tsize;
  98.  
  99. {
  100.  
  101.     /* 
  102.     extern int d_next();
  103.     */
  104.  
  105.     if (code == 3)    {    /* do for information use */
  106.         count(s);
  107.         *ndirs = numdirs;
  108.         *nfiles = numfiles;
  109.         *tsize = tolsize;
  110.         return OK;
  111.     }
  112.     appl_init();
  113.     if (!rsrc_load("HDL.RSC"))    {
  114.         goto cleanup;
  115.     }
  116.  
  117.     if (getalladdr() != OK)        {
  118.         goto cleanup;
  119.     }
  120.  
  121.     do    {
  122.         count(s);
  123.         if (!code)    {                /* do rm files and dirs */
  124.             rmfile(getinfo(s, d, code));
  125.         } else if (code == 1)    {    /* do cp files and dirs */
  126.             cpfile(getinfo(s, d, code));
  127.         } else     {                    /* do rm files and dirs */
  128.             mvfile(getinfo(s, d, code));
  129.         } 
  130.     } while (d_next(&s));
  131.  
  132. cleanup:
  133.     appl_exit();
  134.     return OK;
  135. }
  136.  
  137.  
  138. /* do the rm file job */
  139.  
  140. rmfile(flag)
  141. int flag;
  142.  
  143. {
  144.  
  145.     int ret;
  146.  
  147.     if (showbox(rmtitle) == CANCEL)        {
  148.         goto endrm;
  149.     }
  150.     if (flag == FTOD)     {     /* one file from dir rm */
  151.         updatedir();
  152.         updatefile();
  153.     redel:
  154.         if ((ret = Fdelete(fixsrc)))    {
  155.             if ((ret == 0xFFFA) || (ret == 0xFFFE))    { /* seek error or */
  156.                 Pterm(1);                              /* drive not ready */
  157.             }
  158.             if (err(cntdelf) == 2)    {    /* retry */
  159.                 goto redel;
  160.             } else {                    /* quit */
  161.                 goto endrm;
  162.             }
  163.         }
  164.     } else {                    /* rm dir or files */
  165.         fixdst = fixsrc;
  166.         dormfd();
  167.     }
  168.  
  169. endrm:
  170.     erasemsg();
  171.     Mfree(fixsrc);
  172.     Mfree(fixdst);
  173.     return OK;
  174. }
  175.  
  176.  
  177. /* do the cp file job */
  178.  
  179. cpfile(flag)
  180.  
  181. int flag;
  182.  
  183. {
  184.  
  185.     if (showbox(cptitle) == CANCEL)        {
  186.         goto endcp;
  187.     }
  188.     if (flag == DTOD)     {    /* files and directories cp */
  189.         docpfd();
  190.     } else {                /* a file cp */
  191.         updatedir();
  192.         updatefile();
  193.         wrfile(fixsrc, fixdst);
  194.     }
  195.  
  196. endcp:
  197.     erasemsg();
  198.     Mfree(fixsrc);
  199.     Mfree(fixdst);
  200.     return OK;
  201. }
  202.  
  203.  
  204.  
  205. /* do the mv file job */
  206.  
  207. mvfile(flag)
  208. int flag;
  209.  
  210. {
  211.  
  212.     if (showbox(mvtitle) == CANCEL)        {
  213.         goto endmv;
  214.     }
  215.     if (flag == DTOD)    {    /* files and directories mv */
  216.         domvfd();
  217.     } else {                /* a file mv */
  218.         updatedir();
  219.         updatefile();
  220.         wrfile(fixsrc, fixdst);
  221.     remvdel:
  222.         if (Fdelete(fixsrc))    {
  223.             if (err(cntdelf) == 2)    {    /* retry */
  224.                 goto remvdel;
  225.             } else {                    /* quit */
  226.                 goto endmv;
  227.             }
  228.         }
  229.     }
  230.  
  231. endmv:
  232.     erasemsg();
  233.     Mfree(fixsrc);
  234.     Mfree(fixdst);
  235.     return OK;
  236. }
  237.  
  238.  
  239.  
  240.  
  241.  
  242. /* recursively rm dir or files form a given path */
  243.  
  244. dormfd()
  245.  
  246. {
  247.     char *saved;
  248.     extern char *strcat();
  249.     extern char *strcpy();
  250.     DMABUFFER dumb;
  251.     int ret;
  252.  
  253.     saved = (DMABUFFER *)Fgetdta();
  254.     Fsetdta(&dumb);
  255.     strcat(getall, fixsrc);
  256.     if (!Fsfirst(fixsrc, 0xFF))    {
  257.         do     {
  258.             if (dumb.d_fname[0] != '.')    {
  259.                 if (S_IFDIR & dumb.d_fattr)    {
  260.                     chksrcbuf(DIRLEN);        /* check buf size */
  261.                     addfile(fixsrc, dumb.d_fname);/* add a dir to the path */
  262.                     strcat(bckslsh, fixsrc);
  263.                     dormfd();                /* to the recursion */
  264.                     rmstarb(fixsrc);        /* rm the star and back slash */
  265.                     getlastpath(filestr, fixsrc); 
  266.                     unpack(filestr);
  267.                     strcpy(filestr,
  268.                             ((TEDINFO *)(cpbox[CPDIR].ob_spec))->te_ptext); 
  269.                     strcpy("_", ((TEDINFO *)(cpbox[CPFILE].ob_spec))->te_ptext);
  270.                     objc_draw(cpbox, CPFILE, MAX_DEPTH, 0, 0, wdesk, hdesk);
  271.                     objc_draw(cpbox, CPDIR, MAX_DEPTH, 0, 0, wdesk, hdesk);
  272.                     /* delete a dir from source */
  273.                 redeld:
  274.                     if (Ddelete(fixsrc))    {
  275.                         if ((ret = err(cntdeld)) == 2)    { /* retry */
  276.                             goto redeld;
  277.                         } else if (ret == 3)    {         /* abort */
  278.                             Pterm(1);
  279.                         }
  280.                     }
  281.                     backdir(fixsrc);        /* back one dir */
  282.                     updatndir();
  283.                     srclen -= DIRLEN;        /* subtract the add lenth */
  284.  
  285.                 } else {
  286.                     chksrcbuf(FILELEN);        /* check buf size */
  287.                     addfile(fixsrc, dumb.d_fname);
  288.                     updatedir();
  289.                     /* update the file box */
  290.                     unpack(dumb.d_fname); 
  291.                     strcpy(dumb.d_fname,
  292.                             ((TEDINFO *)(cpbox[CPFILE].ob_spec))->te_ptext); 
  293.                     objc_draw(cpbox, CPFILE, MAX_DEPTH, 0, 0, wdesk, hdesk);
  294.                 redelf:
  295.                     if ((ret = Fdelete(fixsrc)))    {
  296.                         if ((ret == 0xFFFA) || (ret == 0xFFFE))    { 
  297.                             /* seek error or  drive not ready */
  298.                             Pterm(1);                              
  299.                         }
  300.                         if ((ret = err(cntdelf)) == 2)    {    /* retry */
  301.                             goto redelf;
  302.                         } else if (ret == 3)    {            /* abort */
  303.                             Pterm(1);
  304.                         }
  305.                     }
  306.                     updatnfile();
  307.                     backdir(fixsrc);
  308.                     srclen -= FILELEN;        /* subtract the add lenth */
  309.                 }
  310.             } 
  311.         } while (!Fsnext());
  312.     } else {
  313.         Pterm(1);
  314.     }
  315.     Fsetdta(saved);
  316.     return OK;
  317. }
  318.  
  319.  
  320.  
  321. /* recursively cp files and directories from the given path */
  322.  
  323.  
  324. docpfd()
  325.  
  326. {
  327.     char *saved;
  328.     extern char *strcat();
  329.     extern char *strcpy();
  330.     DMABUFFER dumb;
  331.     int ret, code;
  332.  
  333.     saved = (DMABUFFER *)Fgetdta();
  334.     Fsetdta(&dumb);
  335.     strcat(getall, fixsrc);
  336.     if (!Fsfirst(fixsrc, 0xFF))    {
  337.         do     {
  338.             if (dumb.d_fname[0] != '.')    {
  339.                 if (S_IFDIR & dumb.d_fattr)    {
  340.                     chksrcbuf(DIRLEN);        /* check buf size */
  341.                     addfile(fixsrc, dumb.d_fname);/* add a dir to the path */
  342.                     strcat(bckslsh, fixsrc);
  343.                     chkdstbuf(DIRLEN);        /* check buf size */
  344.                     strcat(dumb.d_fname, fixdst);
  345.                     unpack(dumb.d_fname);
  346.                     strcpy(dumb.d_fname,
  347.                             ((TEDINFO *)(cpbox[CPDIR].ob_spec))->te_ptext);
  348.                     strcpy("_", ((TEDINFO *)(cpbox[CPFILE].ob_spec))->te_ptext);
  349.                     objc_draw(cpbox, CPFILE, MAX_DEPTH, 0, 0, wdesk, hdesk);
  350.                     objc_draw(cpbox, CPDIR, MAX_DEPTH, 0, 0, wdesk, hdesk);
  351.                     /* update check the dir existing or not */
  352.                     if ((code = chkdir(dumb.d_fname, cpbox)) == QUIT)    {
  353.                         Pterm(1);
  354.                     } else if (code == SKIP)    {
  355.                         /* update the number of dir */
  356.                         updatndir();
  357.                         backdir(fixsrc);
  358.                         backdir(fixdst);
  359.                         srclen -= DIRLEN;        /* subtract the add lenth */
  360.                         dstlen -= DIRLEN;        /* subtract the add lenth */
  361.                         continue;
  362.                     }
  363.  
  364.                     if ((editdir) || (code == OK))    {
  365.                     recreate:
  366.                         if (Dcreate(fixdst))    {
  367.                             if ((ret = err(cntcrtdr)) == 1)    {    /* skip */
  368.                                 backdir(fixsrc);
  369.                                 backdir(fixdst);
  370.                                 srclen -= DIRLEN;    /* subtract the add lenth */
  371.                                 dstlen -= DIRLEN;    /* subtract the add lenth */
  372.                                 /* update the number of dir */
  373.                                 updatndir();
  374.                                 continue;
  375.                             } else if (ret == 2)    {    /* retry */
  376.                                 goto recreate;
  377.                             } else     {                    /* quit */
  378.                                 Pterm(1);
  379.                             }
  380.                         }
  381.                     }
  382.                     /* update the number of dir */
  383.                     updatndir();
  384.                     strcat(bckslsh, fixdst);/* fixdst -> c:\d1\d2\ */
  385.                     docpfd();                /* do the recursion */
  386.                     backdir(fixsrc);        /* back one dir */
  387.                     backdir(fixdst);        /* back one dir */
  388.                     srclen -= DIRLEN;        /* subtract the add lenth */
  389.                     dstlen -= DIRLEN;        /* subtract the add lenth */
  390.  
  391.                 } else {
  392.                     chksrcbuf(FILELEN);        /* check buf size */
  393.                     addfile(fixsrc, dumb.d_fname);
  394.                     chkdstbuf(FILELEN);        /* check buf size */
  395.                     addfile(fixdst, dumb.d_fname);
  396.                     updatedir();             /* update the folder */
  397.                     /* update the file box */
  398.                     unpack(dumb.d_fname); 
  399.                     strcpy(dumb.d_fname,
  400.                             ((TEDINFO *)(cpbox[CPFILE].ob_spec))->te_ptext); 
  401.                     objc_draw(cpbox, CPFILE, MAX_DEPTH, 0, 0, wdesk, hdesk);
  402.                     wrfile(fixsrc, fixdst);    /* cp a file to the destination */
  403.                     backdir(fixsrc);        /* back one dir */
  404.                     backdir(fixdst);        /* back one dir */
  405.                     srclen -= FILELEN;        /* subtract the add lenth */
  406.                     dstlen -= FILELEN;        /* subtract the add lenth */
  407.                 }
  408.             } 
  409.         } while (!Fsnext());
  410.     } else {
  411.         Pterm(1);
  412.     }
  413.     Fsetdta(saved);
  414.     return OK;
  415. }
  416.  
  417.  
  418. /* recursively mv files or directoies from a given path */
  419.  
  420.  
  421. domvfd()
  422.  
  423.  
  424. {
  425.     char *saved;
  426.     extern char *strcat();
  427.     extern char *strcpy();
  428.     DMABUFFER dumb;
  429.     int ret, code;
  430.  
  431.     saved = (DMABUFFER *)Fgetdta();
  432.     Fsetdta(&dumb);
  433.     strcat(getall, fixsrc);
  434.     if (!Fsfirst(fixsrc, 0xFF))    {
  435.         do     {
  436.             if (dumb.d_fname[0] != '.')    {
  437.                 if (S_IFDIR & dumb.d_fattr)    {
  438.                     chksrcbuf(DIRLEN);        /* check buf size */
  439.                     addfile(fixsrc, dumb.d_fname); /* add a dir into the path */
  440.                     strcat(bckslsh, fixsrc);
  441.                     chkdstbuf(DIRLEN);        /* check buf size */
  442.                     strcat(dumb.d_fname, fixdst);
  443.                     unpack(dumb.d_fname);
  444.                     strcpy(dumb.d_fname,
  445.                             ((TEDINFO *)(cpbox[CPDIR].ob_spec))->te_ptext);
  446.                     strcpy("_", ((TEDINFO *)(cpbox[CPFILE].ob_spec))->te_ptext);
  447.                     objc_draw(cpbox, CPFILE, MAX_DEPTH, 0, 0, wdesk, hdesk);
  448.                     objc_draw(cpbox, CPDIR, MAX_DEPTH, 0, 0, wdesk, hdesk);
  449.                     /* update check the dir existing or not */
  450.                     if ((code = chkdir(dumb.d_fname, cpbox)) == QUIT)    {
  451.                         Pterm(1);
  452.                     } else if (code == SKIP)    {
  453.                         backdir(fixsrc);
  454.                         backdir(fixdst);
  455.                         updatndir();
  456.                         srclen -= DIRLEN;        /* subtract the add lenth */
  457.                         dstlen -= DIRLEN;        /* subtract the add lenth */
  458.                         continue;
  459.                     }
  460.  
  461.                     if ((editdir) || (code == OK))    {
  462.                     recrtd:
  463.                         if (Dcreate(fixdst))    {
  464.                             if ((ret = err(cntcrtdr)) == 1)    {    /* skip */
  465.                                 backdir(fixsrc);
  466.                                 backdir(fixdst);
  467.                                 updatndir();
  468.                                 srclen -= DIRLEN;    /* subtract the add lenth */
  469.                                 dstlen -= DIRLEN;    /* subtract the add lenth */
  470.                                 continue;
  471.                             } else if (ret == 2)    {    /* retry */
  472.                                 goto recrtd;
  473.                             } else     {                    /* quit */
  474.                                 Pterm(1);
  475.                             }
  476.                         }
  477.                     }
  478.                     updatndir();
  479.                     strcat(bckslsh, fixdst);
  480.                     domvfd();                /* do the recursion */
  481.                     rmstarb(fixsrc);        /* after call, -> c:\d1\ */
  482.                 remvd:
  483.                     if (Ddelete(fixsrc))    { /* delete a dir */
  484.                         if ((ret = err(cntdeld)) == 2)    { /* retry */
  485.                             goto remvd;
  486.                         } else if (ret == 3)    {         /* abort */
  487.                             Pterm(1);
  488.                         }
  489.                     }
  490.                     backdir(fixsrc);        /* back one dir */
  491.                     backdir(fixdst);        /* back one dir */
  492.                     srclen -= DIRLEN;        /* subtract the add lenth */
  493.                     dstlen -= DIRLEN;        /* subtract the add lenth */
  494.  
  495.                 } else {
  496.                     chksrcbuf(FILELEN);        /* check buf size */
  497.                     addfile(fixsrc, dumb.d_fname);
  498.                     chkdstbuf(FILELEN);        /* check buf size */
  499.                     addfile(fixdst, dumb.d_fname);
  500.                     updatedir();
  501.                     /* update the file */
  502.                     unpack(dumb.d_fname); 
  503.                     strcpy(dumb.d_fname,
  504.                             ((TEDINFO *)(cpbox[CPFILE].ob_spec))->te_ptext); 
  505.                     objc_draw(cpbox, CPFILE, MAX_DEPTH, 0, 0, wdesk, hdesk);
  506.                     wrfile(fixsrc, fixdst);        /* cp one file to destination */
  507.                     /* rm the file from source */
  508.                 remvf:
  509.                     if (Fdelete(fixsrc))    {
  510.                         if ((ret = err(cntdelf)) == 2)    {    /* retry */
  511.                             goto remvf;
  512.                         } else if (ret == 3)    {            /* abort */
  513.                             Pterm(1);
  514.                         }
  515.                     }
  516.                     backdir(fixsrc);        /* back one dir */
  517.                     backdir(fixdst);        /* back one dir */
  518.                     srclen -= FILELEN;        /* subtract the add lenth */
  519.                     dstlen -= FILELEN;        /* subtract the add lenth */
  520.                 }
  521.             } 
  522.         } while (!Fsnext());
  523.     } else {
  524.         Pterm(1);
  525.     }
  526.     Fsetdta(saved);
  527.     return OK;
  528. }
  529.  
  530.  
  531. /* set the right drive and call the recursive routine to do the counting */
  532.  
  533.  
  534. count(s)
  535.  
  536. char *s;
  537.  
  538. {
  539.     char *buf, *tmp;
  540.     int drv;
  541.  
  542.     buf = (char *)Malloc((long)sizeof(s));
  543.     strcpy(s, buf);
  544.     tmp = buf;
  545.     drv = *buf;
  546.     if (drv >= 'a')        {
  547.         drv -= 'a';
  548.     } else {
  549.         drv -= 'A';
  550.     }
  551.     Dsetdrv(drv); 
  552.     while (*tmp)    {
  553.         tmp++;
  554.     }
  555.     if (*(tmp-1) == '*')    {
  556.         *(tmp-4) = '\0';
  557.         while(*buf != '\\')        {
  558.             buf++;
  559.         }
  560.         if (Dsetpath(buf))    {
  561.             Pterm(1);
  562.         }
  563.         countrec();
  564.     } else    {
  565.         numfiles = 1;
  566.     }
  567.     Mfree(buf);
  568.     return OK;
  569. }
  570.  
  571.  
  572. /* counte the file and directory recursivly */
  573.  
  574. countrec()
  575.  
  576.  
  577. {
  578.     char *saved;
  579.     DMABUFFER dumb;
  580.  
  581.     saved = (DMABUFFER *)Fgetdta();
  582.     Fsetdta(&dumb);
  583.     if (!Fsfirst(".\\*.*", 0xFF))    {
  584.         do     {
  585.             if (dumb.d_fname[0] != '.')    {
  586.                 if (S_IFDIR & dumb.d_fattr)    {
  587.                     /* setpath to one more down */
  588.                     if (Dsetpath(dumb.d_fname))    {
  589.                         Pterm(1);
  590.                     }
  591.                     numdirs++;
  592.                     countrec();        /* to the recursion */
  593.                     /* setpath to one back */
  594.                     if (Dsetpath(".\\.."))    {
  595.                         Pterm(1);
  596.                     }
  597.                 } else {
  598.                     numfiles++;
  599.                     tolsize += dumb.d_fsize;
  600.                 }
  601.             } 
  602.         } while (!Fsnext());
  603.     }
  604.     Fsetdta(saved);
  605.     return OK;
  606. }
  607.  
  608.  
  609. /* Copy the file from the s to d */
  610.  
  611. wrfile(s, d)
  612.  
  613. char *s, *d;
  614.  
  615. {
  616.     int code, ret, status;
  617.     int inhand;
  618.     int outhand;
  619.     DMABUFFER *mydta;
  620.     char *buffer, *saved;
  621.     long copysize;
  622.  
  623. open:
  624.  
  625.     if ((inhand = Fopen(s, 0)) < 0)    {
  626.         if ((inhand == 0xFFFA) || (inhand == 0xFFFE))    {/* seek error or */
  627.             Pterm(1);                                    /* drive not ready */
  628.         }
  629.         if ((ret = err(cntopen)) == 1)    {     /* skip */
  630.             return OK;
  631.         } else if (ret == 2)    {            /* retry */
  632.             goto open;
  633.         } else {                            /* abort */
  634.             Pterm(1);
  635.         }
  636.     }
  637.  
  638.     saved = (DMABUFFER *)Fgetdta();
  639.     Fsetdta(mydta=(DMABUFFER *)Malloc((long)sizeof(DMABUFFER)));
  640.  
  641.     if (Fsfirst(s, 0xF7))    {
  642.         if (err(rderror) == 1)    {     /* skip */
  643.             goto doup;
  644.         } else {                     /* abort */
  645.             Fclose(inhand);
  646.             Mfree(mydta);
  647.             Pterm(1);
  648.         }
  649.     }
  650.  
  651.     /* check the created file existing or not */
  652.     if ((code = chkfile(d, cpbox)) == QUIT)    {
  653.         Fclose(inhand);
  654.         Mfree(mydta);
  655.         Pterm(1);
  656.     } else if (code == SKIP)    {
  657.         goto doup;
  658.     }
  659.  
  660.     status = mydta->d_fattr & 7;
  661. create:
  662.  
  663.     if ((outhand = Fcreate(d, status)) < 0)    {
  664.         if ((ret = err(cntcrtfl)) == 1)    {    /* skip */
  665.             goto doup;
  666.         } else if (ret == 2)    {            /* retry */
  667.             goto create;
  668.         } else {                            /* abort */
  669.             Fclose(inhand);
  670.             Mfree(mydta);
  671.             Pterm(1);
  672.         }
  673.     }
  674.  
  675.     buffer = (char *)Malloc(8192L);
  676.     copysize = mydta->d_fsize;
  677.     while (copysize > 8192)    {
  678.         if (Fread(inhand, 8192L, buffer) < 0)    {
  679.             if (err(rderror) == 1)    {    /* skip */
  680.                 Fdelete(d);
  681.                 goto okup;
  682.             } else {                    /* abort */
  683.                 goto quitup;
  684.             }
  685.         }
  686.  
  687.         if ((status = Fwrite(outhand, 8192L, buffer)) < 0)    {
  688.             if (err(wrerror) == 1)    {    /* skip */
  689.                 Fdelete(d);
  690.                 goto okup;
  691.             } else {                    /* abort */
  692.                 goto quitup;
  693.             }
  694.         }
  695.         /* check if there are sufficent memory */
  696.         if (status != 8192)        { /* not sufficent memory ??*/
  697.             err(nomemory);
  698.             goto quitup;
  699.         }
  700.         copysize -= 8192;
  701.     }
  702.  
  703.     if (copysize > 0)    {
  704.         if (Fread(inhand, copysize, buffer) < 0)    {
  705.             if (err(rderror) == 1)    {        /* skip */
  706.                 Fdelete(d);
  707.                 goto okup;
  708.             } else {                        /* abort */
  709.                 goto quitup;
  710.             }
  711.         }
  712.  
  713.         if ((status = Fwrite(outhand, copysize, buffer)) < 0)    {
  714.             if (err(wrerror) == 1)    {    /* skip */
  715.                 Fdelete(d);
  716.                 goto okup;
  717.             } else {                    /* abort */
  718.                 goto quitup;
  719.             }
  720.         }
  721.         /* check if there are sufficent memory */
  722.         if (status != copysize)        {
  723.             /* update not sufficent memory ??*/
  724.             err(nomemory);
  725.             goto quitup;
  726.         }
  727.     }
  728.  
  729. okup:
  730.     Fclose(outhand);
  731.     Mfree(buffer);
  732.  
  733. doup:
  734.  
  735.     Fclose(inhand);
  736.     Mfree(mydta);
  737.     Fsetdta(saved);
  738.     updatnfile();
  739.     return(OK);
  740.  
  741. quitup:
  742.  
  743.     Fclose(inhand);
  744.     Fclose(outhand);
  745.     Fdelete(d);
  746.     Mfree(buffer);
  747.     Mfree(mydta);
  748.     Fsetdta(saved);
  749.     Pterm(1);
  750. }
  751.  
  752.  
  753. /* Copy s and d into fixsrc and fixdst. Also check it is one file
  754.    copy or files and directories copy */
  755.  
  756. getinfo(s, d, code)
  757.  
  758. char *s, *d;
  759. int code;
  760.  
  761. {
  762.  
  763.     int sdir=0, ddir=0;
  764.     char *ptrs, *ptrd;
  765.     extern char *strcat();
  766.  
  767.     ptrs = s;
  768.     ptrd = d;
  769.     srclen = strlen(s) + 5;     /* 1 for null and 4 for \*.* */
  770.     dstlen = strlen(d) + 5; 
  771.     srcbuf = 500;
  772.     dstbuf = 500;
  773.     while (srclen > srcbuf)    {
  774.         srcbuf *= 2;
  775.     }
  776.     while (dstlen > dstbuf)    {
  777.         dstbuf *= 2;
  778.     }
  779.     fixsrc = (char *)Malloc((long)srcbuf);
  780.     fixdst = (char *)Malloc((long)dstbuf);
  781.     mystrcp(fixsrc, &ptrs);    /* ptrs -> c:\d1\*.* or c:\d1\f; */
  782.                             /*after ptrs->*.* or f */
  783.     if (*ptrs == '*')    {    /* source are dir */
  784.         sdir = 1;
  785.     } 
  786.  
  787.     if (code)    {        /* do directories or files cp or mv */
  788.         mystrcp(fixdst, &ptrd);    /* ptrd -> c:\d1\*.* or c:\d1\f; */
  789.                                 /*after ptrd->*.* or f */
  790.         if (*ptrd == '*')    {    /* target are dir */
  791.             ddir = 1;
  792.         }
  793.         if ((sdir) && (ddir))    {                 /* dir to dir */
  794.             return (DTOD);
  795.         } else if ((!sdir) && (!ddir))    {         /* file to file */
  796.             return (FTOF);
  797.         } else {                                /* one file to dir */
  798.             chkdstbuf(FILELEN);                    /* check buf size */
  799.             strcat(ptrs, fixdst);
  800.             return (FTOD);
  801.         }
  802.     } else     {                    /* else do directories or files rm */
  803.         if (sdir)    {
  804.             return(DTOD);
  805.         } else {
  806.             return(FTOD);
  807.         }
  808.     }
  809. }
  810.  
  811.  
  812.  
  813.  
  814. /*  this call will copy the string inside the s to 
  815.  *     the fixs. For example,
  816.  *     if s -> c:\d1\d2\*.* or c:\d1\d2\f, after the call,
  817.  *    fixs -> \d1\d2\  or \d1\d2\f ; s -> *.* or f            */
  818.  
  819. mystrcp(fixs, s)
  820.  
  821. char *fixs;
  822. char **s;
  823.  
  824. {
  825.     char *ptr;
  826.  
  827.     ptr = *s;
  828.     while ((*ptr) && (*ptr != '*'))        {
  829.         *fixs++ = *ptr++;
  830.     }
  831.     *fixs = '\0';
  832.     if (*ptr == '*')        {
  833.         *s = ptr;
  834.     } else {
  835.         while (*ptr != '\\')    {
  836.             ptr--;
  837.         }
  838.         *s = ++ptr;
  839.     }
  840.  
  841. }
  842.  
  843.  
  844. /* check the size of source buffer */
  845.  
  846. chksrcbuf(addlen)
  847.  
  848. int addlen;
  849.  
  850. {
  851.  
  852.     char *ptr;
  853.  
  854.     if ((srclen + addlen) > srcbuf)        {
  855.         srcbuf *= 2;
  856.         ptr = fixsrc;
  857.         fixsrc = (char *)Malloc((long)srcbuf);
  858.         strcpy(ptr, fixsrc);
  859.         Mfree(ptr);
  860.     }
  861.     srclen += addlen;
  862. }
  863.  
  864.  
  865. /* check the size of target buffer */
  866.  
  867. chkdstbuf(addlen)
  868.  
  869. int addlen;
  870.  
  871. {
  872.  
  873.     char *ptr;
  874.  
  875.     if ((dstlen + addlen) > dstbuf)        {
  876.         dstbuf *= 2;
  877.         ptr = fixdst;
  878.         fixdst = (char *)Malloc((long)dstbuf);
  879.         strcpy(ptr, fixdst);
  880.         Mfree(ptr);
  881.     }
  882.     dstlen += addlen;
  883. }
  884.  
  885.  
  886. /* s -> c:\d1\d2\*.* or c:\d1\d2\, obj -> f; after the call
  887.  * s -> c:\d1\d2\f                            */
  888.  
  889. addfile(s, obj)
  890.  
  891. char *s, *obj;
  892.  
  893. {
  894.     char *ptr;
  895.     extern char *strcat();
  896.  
  897.     ptr = s;
  898.     while (*ptr)    {
  899.         ptr++;
  900.     }
  901.     if (*(ptr-1) == '*')    {
  902.         *(ptr-3) = '\0';
  903.     }
  904.     strcat(obj, s);
  905. }
  906.  
  907.  
  908.  
  909. /* src -> c:\d1\d2\*.* or -> c:\d3\d5\, after the call,
  910.  * src -> c:\d1\d2 or -> c:\d3\d5                        */
  911.  
  912. rmstarb(src)
  913.  
  914. char *src;
  915.  
  916. {
  917.  
  918.     char *ptr;
  919.  
  920.     ptr = src;
  921.     while (*ptr)        {
  922.         ptr++;
  923.     }
  924.     if (*(ptr-1) == '\\')    {    /* src -> c:\d3\d5\ */
  925.         *(ptr-1) = '\0';
  926.     } else {                    /* src -> c:\d3\d5\*.*  */
  927.         *(ptr-4) = '\0';
  928.     }
  929. }
  930.  
  931.  
  932.  
  933.  
  934. /* str -> c:\d1\d2\*.* or c:\d1\d2\ or c:\d2\d4; after the call,
  935.  * str -> c:\d1\*.* or c:\d1\  or c:\d2\        */
  936.  
  937. backdir(str)
  938.  
  939. char *str;
  940.  
  941. {
  942.     char *ptr;
  943.  
  944.     ptr = str;
  945.     while (*ptr)      {
  946.         ptr++;
  947.     }
  948.     if (*(ptr-1) == '*')    {        /* str -> c:\d1\d2\*.*    */
  949.         ptr -= 5;                    /* ptr -> 2 of c:\d1\d2 */
  950.         while (*ptr != '\\')    {
  951.             ptr--;
  952.         }
  953.         *ptr++;
  954.         *ptr++ = '*';
  955.         *ptr++ = '.';
  956.         *ptr++ = '*';
  957.         *ptr = '\0';
  958.     } else if (*(ptr-1) == '\\')        {    /* str -> c:\d1\d2\ */
  959.         ptr -= 2;
  960.         while (*ptr != '\\')    {
  961.             ptr--;
  962.         }
  963.         *(ptr + 1) = '\0';
  964.     } else     {                    /* str -> c:\d1\d2  */
  965.         while (*ptr != '\\')    {
  966.             ptr--;
  967.         }
  968.         *(ptr + 1) = '\0';
  969.     }
  970. }
  971.  
  972.  
  973.  
  974.  
  975. /* check the directory is exist or not */
  976.  
  977.  
  978. chkdir(dir, prvobjtree)
  979.  
  980. char *dir;
  981. OBJECT *prvobjtree;
  982.  
  983. {
  984.  
  985.     int ret, but, drv;
  986.     char *buf;
  987.  
  988.     buf = fixdst;
  989.     editdir = 0;
  990.  
  991.     drv = *buf;
  992.     if (drv >= 'a')        {
  993.         drv -= 'a';
  994.     } else {
  995.         drv -= 'A';
  996.     }
  997.     Dsetdrv(drv);
  998.     buf += 2;                /* set buf -> \d1\x */
  999.     if (!(ret = Dsetpath(buf)))    {    /* direcory exist */
  1000.         /* update name conflict box */
  1001.         strcpy(dir, ((TEDINFO *)(samename[FNAME].ob_spec))->te_ptext);
  1002.         strcpy(dir, ((TEDINFO *)(samename[EDFNAME].ob_spec))->te_ptext);
  1003.         samename[COPY].ob_state = NORMAL;
  1004.         samename[SKIP].ob_state = NORMAL;
  1005.         samename[QUIT].ob_state = NORMAL;
  1006.         graf_mouse(ARROW, 0x0L);
  1007.         dsplymsg(samename);
  1008.         switch((but = form_do(samename, 0)))    {
  1009.             case COPY:    
  1010.                     if (!strcmp(((TEDINFO *)
  1011.                                 (samename[EDFNAME].ob_spec))->te_ptext, dir)) {
  1012.                         strcpy(
  1013.                         ((TEDINFO *)(samename[EDFNAME].ob_spec))->te_ptext,dir);
  1014.                         strcpy(dir,
  1015.                                 ((TEDINFO *)(cpbox[CPDIR].ob_spec))->te_ptext);
  1016.                         dopack(dir);
  1017.                         /* user edit the new name */
  1018.                         changelast(fixdst, dir);
  1019.                         editdir = 1;
  1020.                     }
  1021.                         break;
  1022.             case SKIP:    break;
  1023.             case QUIT:    break;
  1024.         }
  1025.         graf_mouse(HOURGLASS, 0x0L);
  1026.         dsplymsg(prvobjtree);
  1027.         return but;
  1028.     } else if (ret == 0xFFDE)    { /* path not found */
  1029.         return OK;
  1030.     } else {
  1031.         Pterm(1);
  1032.     }
  1033.  
  1034. }
  1035.  
  1036.  
  1037.  
  1038.  
  1039. /* check the file is exist or not */
  1040.  
  1041. chkfile(d, prvobjtree)
  1042.  
  1043. char *d;
  1044. OBJECT *prvobjtree;
  1045.  
  1046. {
  1047.  
  1048.     int ret, but;
  1049.  
  1050.     if ((ret = Fopen(d, 0)) >= 0)    {    /* file exist */
  1051.         /* update name conflict box */
  1052.         getlastpath(filestr, d);
  1053.         unpack(filestr);
  1054.         strcpy(filestr, ((TEDINFO *)(samename[FNAME].ob_spec))->te_ptext);
  1055.         strcpy(filestr, ((TEDINFO *)(samename[EDFNAME].ob_spec))->te_ptext);
  1056.         samename[COPY].ob_state = NORMAL;
  1057.         samename[SKIP].ob_state = NORMAL;
  1058.         samename[QUIT].ob_state = NORMAL;
  1059.         graf_mouse(ARROW, 0x0L);
  1060.         dsplymsg(samename);
  1061.         switch((but = form_do(samename, 0)))    {
  1062.             case COPY:    
  1063.                     if (!strcmp(filestr, 
  1064.                         ((TEDINFO *)(samename[EDFNAME].ob_spec))->te_ptext)) {
  1065.                         /* user edit the new name */
  1066.                         strcpy(
  1067.                         ((TEDINFO *)(samename[EDFNAME].ob_spec))->te_ptext,
  1068.                                                                     filestr);
  1069.                         strcpy(filestr,
  1070.                             ((TEDINFO *)(cpbox[CPFILE].ob_spec))->te_ptext);
  1071.                         dopack(filestr);
  1072.                         changelast(d, filestr);
  1073.                     }
  1074.                         break;
  1075.             case SKIP:    break;
  1076.             case QUIT:    break;
  1077.         }
  1078.         graf_mouse(HOURGLASS, 0x0L);
  1079.         dsplymsg(prvobjtree);
  1080.         return but;
  1081.     } else if (ret == 0xFFDF)    {     /* file not found */
  1082.         return OK;
  1083.     } else {
  1084.         Pterm(1);
  1085.     }
  1086.  
  1087. }
  1088.  
  1089.  
  1090. /* if buf -> unpack.rsc, after the call, buf -> unpack  rsc.  */
  1091.  
  1092. unpack(buf)
  1093.  
  1094. char *buf;
  1095.  
  1096. {
  1097.     int i=0;
  1098.     char *ptr;
  1099.  
  1100.     ptr = buf;
  1101.     while ((*ptr != '.') && (*ptr))    {
  1102.         ptr++;
  1103.         i++;
  1104.     }
  1105.     if ((*ptr == '.') && (i != 8))    { /* src -> abcx.x */
  1106.         *(buf+11) = '\0';
  1107.         *(buf+10) = *(buf+i+3);
  1108.         *(buf+9) = *(buf+i+2);
  1109.         *(buf+8) = *(buf+i+1);
  1110.         for (; i < 8; i++)    {
  1111.             *(buf+i) = ' ';
  1112.         }
  1113.     } else if ((i == 8)    && (*ptr == '.'))     {    /* src -> abcdefgh.x */
  1114.         *(buf+8) = *(buf+9);
  1115.         *(buf+9) = *(buf+10);
  1116.         *(buf+10) = *(buf+11);
  1117.         *(buf+11) = '\0';
  1118.     }
  1119.  
  1120. }
  1121.  
  1122.  
  1123.  
  1124.  
  1125. /* src -> file    rsc, after the call;
  1126.    src -> file.rsc                        */
  1127.  
  1128. dopack(src)
  1129.  
  1130. char *src;
  1131.  
  1132. {
  1133.     char *ptr;
  1134.     int i=0;
  1135.  
  1136.     ptr = src;
  1137.     while ((*ptr != ' ') && (*ptr))    {
  1138.         ptr++;
  1139.         i++;
  1140.     }
  1141.     if (*ptr == ' ')    {
  1142.         *ptr++ = '.';
  1143.         *ptr++ = *(src+8);
  1144.         *ptr++ = *(src+9);
  1145.         *ptr++ = *(src+10);
  1146.         *ptr = '\0';
  1147.     } else if (i > 8)    {
  1148.         *(src+12) = '\0';
  1149.         *(src+11) = *(src+10);
  1150.         *(src+10) = *(src+9);
  1151.         *(src+9) = *(src+8);
  1152.         *(src+8) = '.';
  1153.     }
  1154. }
  1155.  
  1156.  
  1157. /* d -> c:\d1\d2\f1, name -> f2, after the call, d-> c:\d1\d2\f2     */
  1158.  
  1159. changelast(d, name)
  1160.  
  1161. char *d, *name;
  1162.  
  1163. {
  1164.     backdir(d);
  1165.     strcat(name, d);
  1166. }
  1167.  
  1168.  
  1169. /* src -> c:\d1\d2\ or c:\d1\ or c:\; or
  1170.    src -> c:\d1\d2\f or c:\d1\f or c:\f; after the call,
  1171.    buf -> d2 or d1 or c:\                                 */
  1172.  
  1173.  
  1174. getndlast(buf, src)
  1175.  
  1176. char *buf, *src;
  1177.  
  1178. {
  1179.     char *tmp;
  1180.  
  1181.     tmp = src;
  1182.     while (*tmp)    {
  1183.         tmp++;
  1184.     }
  1185.     tmp--;
  1186.     if (*tmp == '\\')    {    /* src -> c:\d1\d2\ or c:\d1\ or c:\ */
  1187.         if (*(tmp-1) == ':')    { /* src -> c:\ */
  1188.             while ((*buf++ = *src++) != '\\')    {
  1189.                 ;
  1190.             }
  1191.             *buf = '\0';
  1192.         } else {
  1193.             tmp--;
  1194.             while (*tmp != '\\')        {
  1195.                 tmp--;
  1196.             }
  1197.             tmp++;
  1198.             while ((*buf = *tmp++) != '\\')    {
  1199.                 buf++;
  1200.             }
  1201.             *buf = '\0';
  1202.         }
  1203.     } else {    /* src -> c:\d1\d2\f or c:\d1\f or c:\f */
  1204.         while (*tmp-- != '\\')        {
  1205.             ;
  1206.         }
  1207.         if (*tmp == ':')    { /* src -> c:\f */
  1208.             while ((*buf++ = *src++) != '\\')    {
  1209.                 ;
  1210.             }
  1211.             *buf = '\0';
  1212.         } else {    /* src -> c:\d1\d2\f or c:\d1\f */
  1213.             while (*tmp != '\\')        {
  1214.                 tmp--;
  1215.             }
  1216.             tmp++;
  1217.             while ((*buf = *tmp++) != '\\')    {
  1218.                 buf++;
  1219.             }
  1220.             *buf = '\0';
  1221.         }
  1222.     }
  1223. }
  1224.  
  1225.  
  1226.  
  1227. /* src -> c:\f or c:\d1\f or c:\f\, after the call,
  1228.    buf -> f                                 */
  1229.  
  1230. getlastpath(buf, src)
  1231.  
  1232. char *buf, *src;
  1233.  
  1234. {
  1235.     char *tmp;
  1236.  
  1237.     tmp = src;
  1238.     while (*tmp)    {
  1239.         tmp++;
  1240.     }
  1241.     if (*(tmp-1) == '\\')    {
  1242.         *(tmp-1) = '\0';
  1243.     }
  1244.     while (*tmp != '\\')        {
  1245.         tmp--;
  1246.     }
  1247.     tmp++;
  1248.     strcpy(tmp, buf);
  1249. }
  1250.  
  1251.  
  1252.  
  1253. /* draw the cp or mv or rm dialog box */
  1254.  
  1255. showbox(title)
  1256.  
  1257. char *title;
  1258.  
  1259. {
  1260.  
  1261.     itoa(numdirs, ((TEDINFO *)(cpbox[NUMDIR].ob_spec))->te_ptext);
  1262.     itoa(numfiles, ((TEDINFO *)(cpbox[NUMFILE].ob_spec))->te_ptext); 
  1263.     ((TEDINFO *)(cpbox[TITLE].ob_spec))->te_ptext = title;
  1264.     graf_mouse(ARROW, 0x0L);
  1265.     cpbox[HIDEBOX].ob_flags = HIDETREE;
  1266.     dsplymsg(cpbox);
  1267.     if (form_do(cpbox, 0) == CANCEL)    {
  1268.         return CANCEL;
  1269.     }
  1270.     cpbox[HIDEBOX].ob_flags = NORMAL;
  1271.     graf_mouse(HOURGLASS, 0x0L);
  1272.     return OK;
  1273.  
  1274. }
  1275.  
  1276. /* up date the number of file in the dialog box */
  1277.  
  1278. updatnfile()
  1279.  
  1280. {
  1281.  
  1282.     itoa(--numfiles, ((TEDINFO *)(cpbox[NUMFILE].ob_spec))->te_ptext);
  1283.     objc_draw(cpbox, NUMFILE, MAX_DEPTH, 0, 0, wdesk, hdesk);
  1284. }
  1285.  
  1286. /* up date the number of directory in the dialog box */
  1287.  
  1288. updatndir()
  1289.  
  1290. {
  1291.  
  1292.     itoa(--numdirs, ((TEDINFO *)(cpbox[NUMDIR].ob_spec))->te_ptext);
  1293.     objc_draw(cpbox, NUMDIR, MAX_DEPTH, 0, 0, wdesk, hdesk);
  1294. }
  1295.  
  1296.  
  1297. /* up date the directory in the dialog box */
  1298.  
  1299.  
  1300. updatedir()
  1301.  
  1302. {
  1303.     getndlast(filestr, fixdst) ;
  1304.     unpack(filestr);
  1305.     strcpy(filestr, ((TEDINFO *)(cpbox[CPDIR].ob_spec))->te_ptext);
  1306.     objc_draw(cpbox, CPDIR, MAX_DEPTH, 0, 0, wdesk, hdesk);
  1307. }
  1308.  
  1309.  
  1310.  
  1311. /* up date the file in the dialog box */
  1312.  
  1313. updatefile()
  1314.  
  1315. {
  1316.     getlastpath(filestr, fixdst) ;
  1317.     unpack(filestr);
  1318.     strcpy(filestr, ((TEDINFO *)(cpbox[CPFILE].ob_spec))->te_ptext);
  1319.     objc_draw(cpbox, CPFILE, MAX_DEPTH, 0, 0, wdesk, hdesk);
  1320.  
  1321. }
  1322.  
  1323.  
  1324.  
  1325. /* convert the integer to the ascci */
  1326.  
  1327. itoa(n, s)
  1328.  
  1329. char *s;
  1330. long n;
  1331.  
  1332. {
  1333.     int i=0, j=0;
  1334.     char tmp[10];
  1335.  
  1336.     do {
  1337.         tmp[i++] = n % 10 + '0';
  1338.     } while ((n /= 10) > 0);
  1339.     for (; i > 0; )    {
  1340.         *s++ = tmp[--i];
  1341.         j++;
  1342.     }
  1343.     for(; j < 4; j++)    {
  1344.         *s++ = ' ';
  1345.     }
  1346. }
  1347.  
  1348.  
  1349.  
  1350. /* get the dialog box string */
  1351.  
  1352. getalladdr()
  1353. {
  1354.  
  1355.     /* Error messages */
  1356.     if (!rsrc_gaddr(5, CNTOPEN, &cntopen)
  1357.         || !rsrc_gaddr(5, CNTCRTDR, &cntcrtdr)
  1358.         || !rsrc_gaddr(5, CNTCRTFL, &cntcrtfl)
  1359.         || !rsrc_gaddr(5, WRERROR, &wrerror)
  1360.         || !rsrc_gaddr(5, NOMEMORY, &nomemory)
  1361.         || !rsrc_gaddr(5, CNTDELF, &cntdelf)
  1362.         || !rsrc_gaddr(5, CNTDELD, &cntdeld)
  1363.         || !rsrc_gaddr(5, RDERROR, &rderror))
  1364.         return ERROR;
  1365.         
  1366.  
  1367.     if (!rsrc_gaddr(0, CPBOX, &cpbox)
  1368.         || !rsrc_gaddr(0, SAMENAME, &samename))    {
  1369.             return ERROR;
  1370.     }
  1371.     return OK;
  1372. }
  1373.  
  1374.  
  1375.  
  1376. /*
  1377.  *  Display a dialogue box on the screen.
  1378.  *    Input:
  1379.  *        tree - object tree for dialogue box to be displayed.
  1380.  *    Output:
  1381.  *        formw, formh, sx, sy, lx, ly - dimensions of box.
  1382.  */
  1383. dsplymsg(tree)
  1384. OBJECT *tree;
  1385. {
  1386.     form_center(tree,&lx, &ly, &formw, &formh);
  1387.     form_dial(1, 0, 0, 0, 0, lx, ly, formw, formh);
  1388.     objc_draw(tree, 0, MAX_DEPTH, 0, 0, wdesk, hdesk);
  1389. }
  1390.  
  1391.  
  1392. /*
  1393.  *  Erase a dialogue box from the screen.
  1394.  *    Input:
  1395.  *        formw, formh, sx, sy, lx, ly - dimensions of box.
  1396.  */
  1397. erasemsg()
  1398. {
  1399.     form_dial(3, 0, 0, 0, 0, lx, ly, formw, formh);
  1400. }
  1401.  
  1402.  
  1403.  
  1404.  
  1405. err(s)
  1406.  
  1407. char *s;
  1408.  
  1409. {
  1410.     int ret;
  1411.  
  1412.     graf_mouse(ARROW, 0x0L);
  1413.     ret = form_alert(1, s);
  1414.     graf_mouse(HOURGLASS, 0x0L);
  1415.     return (ret);
  1416. }
  1417.  
  1418.  
  1419.